#include <iostream>
#include <pthread.h>
#include <functional>
#include <assert.h>

class Thread;
class Thread_
{
public:
    Thread *this_;
    void *arg_;
    Thread_()
        : this_(nullptr), arg_(nullptr)
    {}
    ~Thread_(){}
};
class Thread
{
public:
    // 定义类型别名 func_t，它表示一个函数对象，该函数对象的签名为接收一个 void* 类型的参数，并返回一个 void* 类型的值。
    using func_t = std::function<void *(void *)>;

public:
    Thread(func_t func, void *arg)
        : func_(func), arg_(arg)
    {
    }

    // 在类内创建线程，想让线程执行对应方法，需将方法设置为static，因为静态函数没有this指针
    static void *start_routine(void *arg_)
    {
        // 静态方法不能调用成员函数或成员变量
        // return func_(arg_);
        Thread_ *tmp=static_cast<Thread_ *>(arg_);
        tmp->this_->run();
        delete tmp;
        return nullptr;
    }
    void *start()
    {
        Thread_ *tmp=new Thread_();
        tmp->this_=this;
        tmp->arg_=arg_;
        pthread_create(&tid, nullptr, start_routine, tmp); // 若不将start_routine设为静态成员，那么形参将不匹配
        return nullptr;
    }
    void *run(){
        return func_(arg_);
    }
    void join()
    {
        int n = pthread_join(tid, nullptr);
        assert(n == 0);
    }

private:
    func_t func_;  // 线程要执行的函数
    void *arg_;    // 传入函数的参数
    pthread_t tid; // 线程编号
};